/**
 * - 作者: DoooReyn
 * - 日期: 2023.10.29
 * - 名称: Types
 * - 描述: 类型判断辅助工具
 */
export class Types {
    /**
     * 是否 Function
     * @param t 目标
     * @returns 目标是否Function类型
     */
    static isFunction(t: any) {
        return typeof t === 'function';
    }

    /**
     * 是否数值（且不为 NaN）
     * @param t 目标
     * @returns 目标是否数值
     */
    static isNumber(t: any) {
        return typeof t === 'number' && !this.isNaN(t);
    }

    /**
     * 是否正则表达式
     * @param t 目标
     * @returns
     */
    static isRegExp(t: any) {
        return Object.prototype.toString.call(t) === '[object RegExp]';
    }

    /**
     * 是否字符串
     * @param t 目标
     * @returns 目标是否字符串
     */
    static isString(t: any) {
        return typeof t === 'string';
    }

    /**
     * 是否对象
     * @param t 目标
     * @returns 目标是否对象
     */
    static isObject(t: any) {
        return typeof t === 'object';
    }

    /**
     * 是否严格的对象
     * @param t 目标
     * @returns 目标是否严格的对象
     */
    static isStrictObject(t: any) {
        return Object.prototype.toString.call(t) === '[object Object]';
    }

    /**
     * 是否数组
     * @param t 目标
     * @returns 目标是否数组
     */
    static isArray(t: any) {
        return t instanceof Array;
    }

    /**
     * 是否布尔值
     * @param t 目标
     * @returns 目标是否布尔值
     */
    static isBoolean(t: any) {
        return typeof t === 'boolean';
    }

    /**
     * 是否为 true
     * @param t 目标
     * @returns 目标是否为真
     */
    static isTrue(t: any) {
        if (this.isBoolean(t)) {
            // 布尔值直接判定值
            return Boolean(t);
        } else {
            // null/undefined/NaN 判定为假，其他类型判定为真
            return !this.isNil(t);
        }
    }

    /**
     * 是否为 false
     * @param t 目标
     * @returns 目标是否为假
     */
    static isFalse(t: any) {
        return !this.isTrue(t);
    }

    /**
     * 是否 undefined
     * @param t 目标
     * @returns 目标是否 undefined
     */
    static isUndefined(t: any) {
        return t === undefined;
    }

    /**
     * 是否为 null
     * @param t 目标
     * @returns 目标是否为空
     */
    static isNull(t: any) {
        return t === null;
    }

    /**
     * 是否 NaN
     * @param t 目标
     */
    static isNaN(t: any) {
        return t !== t || isNaN(t);
    }

    /**
     * 是否为空 <undefined/null/NaN>
     * @param t 目标
     * @returns 目标是否为空
     */
    static isNil(t: any) {
        return this.isNull(t) || this.isUndefined(t) || this.isNaN(t);
    }
}
